package com.dust.yuheadline.common.aliyun.oss;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectResult;
import com.dust.yuheadline.common.aliyun.utils.AliOssProperties;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;
import java.util.Date;

/**
 * @author 高翔宇
 * @since 2024-05-1, 周三, 14:20
 */
@Slf4j
@RequiredArgsConstructor
public class OssFileUploader {
    private final AliOssProperties aliOssProperties;

    /**
     * 上传文件
     *
     * @param bytes      文件字节数组
     * @param objectName 文件名
     * @return 文件访问路径
     */
    public String uploadAndGetPresignedUrl(byte[] bytes, String objectName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(aliOssProperties.getEndpoint(), aliOssProperties.getAccessKey(), aliOssProperties.getAccessSecretKey());
        try {
            PutObjectResult putObjectResult = ossClient.putObject(aliOssProperties.getBucketName(), objectName, new ByteArrayInputStream(bytes));
            System.out.println(putObjectResult);
            // 生成预签名的URL
            return ossClient.generatePresignedUrl(aliOssProperties.getBucketName(), objectName, new Date(System.currentTimeMillis() + 3600 * 1000)).toString();
        } catch (OSSException oe) {
            log.error("捕获到OSSException，这意味着您的请求发送到OSS，但由于某种原因被拒绝并返回错误响应。");
            System.out.println("错误消息：" + oe.getErrorMessage());
            System.out.println("错误代码：" + oe.getErrorCode());
            System.out.println("请求ID：" + oe.getRequestId());
            System.out.println("主机ID：" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("捕获到ClientException，这意味着客户端在尝试与OSS通信时遇到了严重的内部问题，例如不能接入网络。");
            System.out.println("错误消息：" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return null;
    }

    /**
     * 上传文件并返回永久访问URL（需Bucket或对象具备公共读权限）
     *
     * @param bytes      文件字节数组（非空）
     * @param objectName 文件名（非空）
     * @return 永久URL（格式：https://<BucketName>.<Endpoint>/<objectName>），上传失败时返回null
     */
    public String uploadAndGetPermanentUrl(byte[] bytes, String objectName) {
        // 参数校验
        if (bytes == null || bytes.length == 0) {
            log.error("上传文件字节数组为空");
            return null;
        }
        if (objectName == null || objectName.trim().isEmpty()) {
            log.error("文件名为空");
            return null;
        }

        // 创建OSSClient实例
        OSS ossClient = new OSSClientBuilder().build(
                aliOssProperties.getEndpoint(),
                aliOssProperties.getAccessKey(),
                aliOssProperties.getAccessSecretKey()
        );

        try {
            // 执行文件上传
            PutObjectResult putObjectResult = ossClient.putObject(
                    aliOssProperties.getBucketName(),
                    objectName,
                    new ByteArrayInputStream(bytes)
            );
            log.info("文件上传成功，OSS返回结果：{}", putObjectResult);

            // 提取Endpoint的域名部分（去除可能存在的http/https协议前缀）
            String endpointDomain = aliOssProperties.getEndpoint()
                    .replaceFirst("^https?://", ""); // 正则表达式去除协议前缀

            // 拼接正确的永久URL（固定使用https协议保证安全）
            String bucketDomain = String.format("https://%s.%s",
                    aliOssProperties.getBucketName(),
                    endpointDomain);
            return bucketDomain + "/" + objectName;

        } catch (OSSException oe) {
            log.error("OSS服务端异常：错误代码={}, 错误信息={}", oe.getErrorCode(), oe.getErrorMessage());
            return null;
        } catch (ClientException ce) {
            log.error("OSS客户端异常：{}", ce.getMessage());
            return null;
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
